這個章節要延續上一篇的郵件服務來繼續介紹下去,上篇使用 原始的郵件服務
去建立寄信,這篇要使用 mailable
來建立寄件服務,這兩個語法其實很類似,在於有沒有匿名函示去做郵件資訊。
近期 Laravel 8 發布了,但因為我目前習慣使用 Laravel 7 的版本,所以還是會以 7 做範例。
建立 Laravel7 專案語法
1
| $ composer create-project laravel/laravel=7.25.* 專案名稱
|
郵件
設定郵件服務,使用SMTP服務,設定Gmail Host等設定。
專案 > .env 設定檔
1 2 3 4 5 6
| MAIL_MAILER=smtp MAIL_HOST=smtp.gmail.com MAIL_PORT=587 MAIL_USERNAME=xxxxxx@gmail.com MAIL_PASSWORD=xxxxxxxxxx MAIL_ENCRYPTION=tls
|
建立 Mailables
類別
使用 artisan
指令建立 Mailables
類別
1
| $ php artisan make:mail MyTestMail
|
1
| Mail created successfully.
|
上面指令建立的PHP檔
__construct()
的方法 為建構子,將這個類別建立成物件的時候,會一併執行。大部分裡面的內容都是執行必要動作。
build()
的方法 主要定義要使用哪個 View 的 Blade(模板)、主旨、BCC、CC 等資訊。
專案 > app > Mail > MyTestMail.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| <?php
namespace App\Mail;
use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels;
class MyTestMail extends Mailable { use Queueable, SerializesModels;
public function __construct() { }
public function build() { return $this->view('view.name'); } }
|
自行定義這個類別,是因為有些專案可能會有多個不同的郵件內容信,所以以類別可以去區分我們所要的東西,但也可以寫得更活化,不一定要用固定的資料去定義。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| <?php
namespace App\Mail;
use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels;
class MyTestMail extends Mailable { use Queueable, SerializesModels;
public $BladeContent;
public function __construct($EmailContent) { $this->BladeContent = $EmailContent; }
public function build() { return $this->from(env('MAIL_USERNAME'),'Sian') ->subject('2020/06/30 Laravel 郵件研討會邀請') ->view('emails.EDM') ->with( [ 'BladeContent' => $this->BladeContent ]); } }
|
from(env('MAIL_USERNAME'),'Sian')
寄件人
subject('2020/06/30 Laravel 郵件研討會邀請')
信件標題
view('emails.EDM')
信件內容
with('xx'=>xxx)
參數傳入信件內容
attach($file,array $option=[])
夾帶檔案
priority($Level = n)
優先等級1到5,1是最高、5是最低
大致上與 原始郵件語法 類似。
建立 信件內容
專案 > resource > views > emails > EDM.blade.php
1 2 3 4 5 6 7 8 9 10 11 12
| <!DOCTYPE html> <html lang="zh-Hant-TW"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> </head> <body> {{ $BladeContent['name'] }}您好,近期舉辦 Laravel 郵件研討會,歡迎各界好手踴躍參與。 </body> </html>
|
建立 Mail Controller
建立 TestMailController
是為了專門處理多筆寄件人的信件。
1
| $ php artisan make:controller TestMailController
|
1
| Controller created successfully.
|
專案 > app > Http > Controllers > TestMailController.php
1 2 3 4 5 6 7 8 9 10
| <?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class TestMailController extends Controller { }
|
- 引入 Mail 的類別
- 引入 自行定義的 Mail 內容類別。
專案 > app > Mail > MyTestMail.php
- 建立一個
send()
的方法
- 在方法內設定 (1)收件者資訊 (2)Blade 模板所需要的參數 (3)將資料傳入寄件資訊及內容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| <?php
namespace App\Http\Controllers;
use Illuminate\Http\Request; use Illuminate\Support\Facades\Mail; use App\Mail\MyTestMail;
class TestMailController extends Controller { public function send(){ $to = collect([ [ 'name' => 'Black', 'email' => 'ya005845@hotmail.com' ] ]); $EmailContent = [ 'name' => 'Small Black' ]; Mail::to($to) ->send(new MyTestMail($EmailContent));
return '發送成功'; } }
|
傳送 Mailable 的方法
1、寄件人、傳送內容
1 2
| Mail::to($to) ->send(new MyTestMail($EmailContent));
|
2、連同 CC/BCC
1 2 3 4
| Mail::to($to) ->cc($cc) ->bcc($bcc) ->send(new MyTestMail($EmailContent));
|
設定路由
專案 > routes > web.php
1 2 3 4 5
| <?php
use Illuminate\Support\Facades\Route;
Route::get('/send', 'TestMailController@send');
|
執行專案
連結
http://127.0.0.1:8000/send
成功寄發
※ 觀看我文章的看官們,如果你專案是 Laravel 是 8版的,可能會遇到 controller 找不到的問題,解決辦法可以參考下方連結試試看。
Target class controller does not exist - Laravel 8
結論
其實兩種 Mail 語法用法類似,但取決於開發者要用哪一種,但本人會比較習慣用後者,畢竟結構性比較好。下一章節還是會介紹郵件的部分,會以比較深入去做實作。
標籤: w3HexSchool
PHP
Laravel